import java.util.Arrays;

public class MyArraylist {
    private int[] arr;//存储数据
    int size;//有效长度
    public MyArraylist(int capacity) {
        arr=new int[capacity];
    }
    //返回数组长度
    public int size(){
        return size;
    }
    //在表头添加元素
    public void add(int val){
        if(size==arr.length){
            resize();
        }
        arr[size]=val;
        size++;
    }

    //扩容
    public void resize(){
        //浮点数相乘对于cpu来说运算速度远远低于+-和移位运算
//        int[] newArr=new int[size*3/2];
        //标准库里的写法:
        int[] newArr=new int[arr.length+(arr.length>>1)];
        for (int i=0;i<size;i++){
            newArr[i]=arr[i];
        }
        //替代就数组
        //此时旧的数组就被垃圾回收给释放掉了，java自带的
        arr=newArr;
    }

    //在index位置添加元素，并将原来的元素和往后的所有元素都往后移一位
    public void add(int index,int val){
        if(index<0||index>size){
            throw new ArrayIndexOutOfBoundsException("数组越界!");
        }
        if(size==arr.length){
            resize();
        }
        //将index（包括index）后的数都往后面搬运
        for (int i = size-1; i >= index ; i--) {
            arr[i+1]=arr[i];
        }
        //然后在index位置赋值为val
        arr[index]=val;

        size++;
    }
    //
    public int get(int index){
        if(index<0||index>size){
            throw new ArrayIndexOutOfBoundsException("数组越界!");
        }
        return arr[index];
    }
    public void set(int index,int val){
        if(index<0||index>size){
            throw new ArrayIndexOutOfBoundsException("数组越界!");
        }
        arr[index]=val;
    }
    public int remove(int index){
        if(index<0||index>size){
            throw new ArrayIndexOutOfBoundsException("数组越界!");
        }
        //重复代码
//        if(index==size-1){
//            size--;
//            return;
//        }
        int result=arr[index];
        int i=index;
        for(;i<size-1;i++){
            arr[i]=arr[i+1];
        }
        size--;

        return result;
    }
    //删除第一个遇到的val
    public void delete(int val){

        for (int i=0;i<size;i++){
            //这里数据类型是int，可以直接用==
            //如果是引用类型的话，用equals()
            if(arr[i]==val){
                remove(i);
                break;
            }
        }

    }
    //判断是否在顺序表中
    public boolean contains(int val){
        for (int i = 0; i < size; i++) {
            if(arr[i]==val){
                return true;
            }
        }
        return false;
    }
    //返回找到的第一个val的下标
    public int indexOf(int val){
        for (int i = 0; i < size; i++) {
            if(arr[i]==val){
                return i;
            }
        }
        return -1;
    }
    public int lastIndexOf(int val){
        for (int i = size-1; i >=0; i--) {
            if(arr[i]==val){
                return i;
            }
        }
        return -1;
    }
    public void clear(){
        size=0;
    }

    @Override
    public String toString() {
//        return "MyArraylist{" +
//                "arr=" + Arrays.toString(arr) +
//                '}';
        StringBuilder stringBuilder=new StringBuilder();
        stringBuilder.append("[");
        for (int i = 0; i < size; i++) {
            stringBuilder.append(arr[i]);
            //除了最后一个元素外，都添加一个" , "
            if (i<size-1){
                stringBuilder.append(" ,");
            }
        }
        stringBuilder.append("]");
        return stringBuilder.toString();
    }
    public boolean isEmpty(){
        return size!=0?false:true;
    }
}
